package ktvutil

import (
	"bufio"
	"encoding/binary"
	"errors"
	"fmt"
	"os"
	"path/filepath"
)

const (
	DAT_VERSION_LIST_NOTICE = 0xDF5A6C01 // 公告列表版本号
	DAT_VERSION_NOTICE      = 0xEF5A6C01 // 公告文件版本号
)

var (
	// 公告列表的路径
	noticeListFilePath = filepath.Join("SYSTEM", "NOTICES.DAT")
	noticeInfoList     = []NoticeInfo{} // 公告内容
)

// 公告信息的定义
type NoticeInfo struct {
	QueuingTime uint32 // seconds
	TextLength  uint32 // 文字的长度
	Dzk32Length uint32 // 32点阵图的长度
}

// 加载公告文件
func LoadNoticeList() error {

	f, err := os.Open(noticeListFilePath)
	if err != nil {
		return err
	}

	defer f.Close()

	// 开始解析文件
	buf := bufio.NewReader(f)

	var copyright DatCopyright
	binary.Read(buf, binary.LittleEndian, &copyright)
	if copyright.IsShiyou() != true || copyright.Version != DAT_VERSION_LIST_NOTICE {
		return errors.New("notice list file version error")
	}

	// 读取信息到内存
	count := copyright.RecordCount
	var i uint32
	for i = 0; i < count; i++ {
		var ni NoticeInfo
		binary.Read(buf, binary.LittleEndian, &ni)
		noticeInfoList = append(noticeInfoList, ni)
	}

	return nil
}

// 清空公告列表
func EmptyNoticeList() {
	noticeInfoList = []NoticeInfo{}
}

// 获取公告的文本
// 内容返回utf8的string
func LoadNoticeText(number int) (string, error) {
	strText := ""

	strFilePath := filepath.Join("SYSTEM", "NOTICE", fmt.Sprintf("NOTICE%d.DAT", number))

	f, err := os.Open(strFilePath)
	if err != nil {
		return strText, err
	}

	defer f.Close()

	// 开始解析文件
	buf := bufio.NewReader(f)

	// 检查版本号
	var copyright DatCopyright
	binary.Read(buf, binary.LittleEndian, &copyright)
	if copyright.IsShiyou() != true {
		return strText, errors.New("notice list file version error")
	}

	// 读取公告信息
	var ni NoticeInfo
	binary.Read(buf, binary.LittleEndian, &ni)

	//	fmt.Printf("text len=%d\n", ni.TextLength)

	// 读取文本内容
	byteBuf := make([]byte, 2*(ni.TextLength+1))
	buf.Read(byteBuf)

	strText = Utf16ByteToUtf8(byteBuf)

	return strText, nil
}

func GetNoticeCount() int {
	return len(noticeInfoList)
}
